// Copyright (c) 2022, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// VMOptions=--optimization-counter-threshold=100 --no-use-osr --no-background-compilation

class C<
    T0,
    T1,
    T2,
    T3,
    T4,
    T5,
    T6,
    T7,
    T8,
    T9,
    T10,
    T11,
    T12,
    T13,
    T14,
    T15,
    T16,
    T17,
    T18,
    T19,
    T20,
    T21,
    T22,
    T23,
    T24,
    T25,
    T26,
    T27,
    T28,
    T29,
    T30,
    T31,
    T32,
    T33,
    T34,
    T35,
    T36,
    T37,
    T38,
    T39,
    T40,
    T41,
    T42,
    T43,
    T44,
    T45,
    T46,
    T47,
    T48,
    T49,
    T50,
    T51,
    T52,
    T53,
    T54,
    T55,
    T56,
    T57,
    T58,
    T59,
    T60,
    T61,
    T62,
    T63,
    T64,
    T65,
    T66,
    T67,
    T68,
    T69,
    T70,
    T71,
    T72,
    T73,
    T74,
    T75,
    T76,
    T77,
    T78,
    T79,
    T80,
    T81,
    T82,
    T83,
    T84,
    T85,
    T86,
    T87,
    T88,
    T89,
    T90,
    T91,
    T92,
    T93,
    T94,
    T95,
    T96,
    T97,
    T98,
    T99,
    T100,
    T101,
    T102,
    T103,
    T104,
    T105,
    T106,
    T107,
    T108,
    T109,
    T110,
    T111,
    T112,
    T113,
    T114,
    T115,
    T116,
    T117,
    T118,
    T119,
    T120,
    T121,
    T122,
    T123,
    T124,
    T125,
    T126,
    T127,
    T128,
    T129,
    T130,
    T131,
    T132,
    T133,
    T134,
    T135,
    T136,
    T137,
    T138,
    T139,
    T140,
    T141,
    T142,
    T143,
    T144,
    T145,
    T146,
    T147,
    T148,
    T149,
    T150,
    T151,
    T152,
    T153,
    T154,
    T155,
    T156,
    T157,
    T158,
    T159,
    T160,
    T161,
    T162,
    T163,
    T164,
    T165,
    T166,
    T167,
    T168,
    T169,
    T170,
    T171,
    T172,
    T173,
    T174,
    T175,
    T176,
    T177,
    T178,
    T179,
    T180,
    T181,
    T182,
    T183,
    T184,
    T185,
    T186,
    T187,
    T188,
    T189,
    T190,
    T191,
    T192,
    T193,
    T194,
    T195,
    T196,
    T197,
    T198,
    T199,
    T200,
    T201,
    T202,
    T203,
    T204,
    T205,
    T206,
    T207,
    T208,
    T209,
    T210,
    T211,
    T212,
    T213,
    T214,
    T215,
    T216,
    T217,
    T218,
    T219,
    T220,
    T221,
    T222,
    T223,
    T224,
    T225,
    T226,
    T227,
    T228,
    T229,
    T230,
    T231,
    T232,
    T233,
    T234,
    T235,
    T236,
    T237,
    T238,
    T239,
    T240,
    T241,
    T242,
    T243,
    T244,
    T245,
    T246,
    T247,
    T248,
    T249,
    T250,
    T251,
    T252,
    T253,
    T254,
    T255,
    T256> {
  @pragma("vm:never-inline")
  static create<T>() {
    return new C<
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        double,
        T>();
  }

  @pragma("vm:never-inline")
  @pragma("vm:entry-point") // Stop TFA
  @pragma("dart2js:noInline")
  dynamic checkIs(dynamic x) => x is T256;

  @pragma("vm:never-inline")
  @pragma("vm:entry-point") // Stop TFA
  @pragma("dart2js:noInline")
  dynamic checkAs(dynamic x) => x as T256;

  @pragma("vm:never-inline")
  @pragma("vm:entry-point") // Stop TFA
  @pragma("dart2js:noInline")
  dynamic checkInstantiate() => new G<G<T256>>();
}

class G<T> {}

main() {
  for (var i = 0; i < 101; i++) {
    var c1 = C.create<int>();
    if (c1.checkIs(42) != true) throw "Wrong is";
    if (c1.checkAs(42) != 42) throw "Wrong as";
    if (c1.checkInstantiate() is! G<G<int>>) throw "Wrong instantiate";

    var c2 = C.create<double>();
    if (c2.checkIs(42.0) != true) throw "Wrong is";
    if (c2.checkAs(42.0) != 42.0) throw "Wrong as";
    if (c2.checkInstantiate() is! G<G<double>>) throw "Wrong instantiate";

    var c3 = C.create<String>();
    if (c3.checkIs("42") != true) throw "Wrong is";
    if (c3.checkAs("42") != "42") throw "Wrong as";
    if (c3.checkInstantiate() is! G<G<String>>) throw "Wrong instantiate";
  }
}
